x86: Fix ept and vt-d co-existence issue.
authorKeir Fraser <keir.fraser@citrix.com>
Fri, 16 Oct 2009 07:25:17 +0000 (08:25 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Fri, 16 Oct 2009 07:25:17 +0000 (08:25 +0100)
For vt-d's mmio address ranges, once ept enables, they should
be added to ept page tables with p2m lock held, and then guest can
access these ranges like conventional ram, but to change the ept
entries, it should take the p2m lock first.

Signed-off-by: Xiantao Zhang <xiantao.zhang@intel.com>
xen/arch/x86/mm/hap/p2m-ept.c
xen/arch/x86/mm/p2m.c

index 47c7be8a57edf31262d3143b0c06092c2f910725..35c81c6b5ba073880fa317b61dd4c9a2c22e20d8 100644 (file)
@@ -524,6 +524,7 @@ void ept_change_entry_emt_with_range(struct domain *d, unsigned long start_gfn,
     mfn_t mfn;
     int order = 0;
 
+    p2m_lock(d->arch.p2m);
     for ( gfn = start_gfn; gfn <= end_gfn; gfn++ )
     {
         e = ept_get_entry_content(d, gfn);
@@ -561,6 +562,7 @@ void ept_change_entry_emt_with_range(struct domain *d, unsigned long start_gfn,
                 ept_set_entry(d, gfn, mfn, order, e.avail1);
         }
     }
+    p2m_unlock(d->arch.p2m);
 }
 
 /* 
index 77ed7f2ca52397eb4edae169f464f10603072ebd..66069ce44224224ee3713f5619c3be6a615b316d 100644 (file)
@@ -2237,7 +2237,9 @@ set_mmio_p2m_entry(struct domain *d, unsigned long gfn, mfn_t mfn)
     }
 
     P2M_DEBUG("set mmio %lx %lx\n", gfn, mfn_x(mfn));
+    p2m_lock(d->arch.p2m);
     rc = set_p2m_entry(d, gfn, mfn, 0, p2m_mmio_direct);
+    p2m_unlock(d->arch.p2m);
     if ( 0 == rc )
         gdprintk(XENLOG_ERR,
             "set_mmio_p2m_entry: set_p2m_entry failed! mfn=%08lx\n",
@@ -2261,7 +2263,9 @@ clear_mmio_p2m_entry(struct domain *d, unsigned long gfn)
             "clear_mmio_p2m_entry: gfn_to_mfn failed! gfn=%08lx\n", gfn);
         return 0;
     }
+    p2m_lock(d->arch.p2m);
     rc = set_p2m_entry(d, gfn, _mfn(INVALID_MFN), 0, 0);
+    p2m_unlock(d->arch.p2m);
 
     return rc;
 }